iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
2
自我挑戰組

一週程式專案挑戰系列 第 13

[專案02]自製踩地雷(六)地圖完成!!

  • 分享至 

  • xImage
  •  

地雷安裝完成,再來就是在四周放上數字,告訴玩家周圍有多少地雷。

【大綱】

  • 地圖掃雷器(數字)
  • 判斷資料狀態
  • 心得

參考:array 1D 轉2D

今日進度

https://ithelp.ithome.com.tw/upload/images/20190914/20091910l37kWea4kk.jpg


【地圖掃雷器(數字)】

【檢查地雷】

每列的第一格到最後一格,
檢查是否有地雷?
有,就把四周的掃雷器+1addNum(列,欄)

for(var newrow=0; newrow<mapsize; newrow++){//第一列~第三列
	boommap[newrow].forEach(function(item,index,array){//第一格~最後一格
		if(item=="*"){
			console.log(newrow,index,array);
			addNum(newrow,index);
		}
	});
}

【將掃雷器數字+1】

for迴圈和if實作,
如果遇到地雷,
則九宮格範圍數字+1。

//數字處理
function addNum(row,col){
	console.log("boom:",row,col)//地雷起始位置
	var rowi,coli;
	for(var rgnine=0;rgnine<9; rgnine++){//rgnine九宮格範圍
		rowi=row+Math.floor(rgnine/3)-1;
		coli=col+(rgnine%3)-1;
		
		if((-1<rowi)&&(rowi<mapsize)//「列」沒超出範圍
		  &&(-1<coli)&&(coli<mapsize)//「欄」沒超出範圍
		  &&(boommap[rowi][coli]!=="*"))
		{
			console.log("add:",rowi,coli);
			boommap[rowi][coli]+=1;
		}
	}
}

【判斷資料狀態】

地雷有了;掃雷器有了,
再來就是製作地圖。

【製作地圖】

mapsize**2是因為地圖是3x3,
所以用地圖長度的平方。

for (let wd=0;wd<mapsize**2;wd++){
	let row =Math.floor(wd/3);
	let col =wd%3;
    
	map[0].innerHTML+="<button>"+boommap[row][col]+"</button>";//上帝地圖
	caseMap(wd,row,col);//加上class屬性
	map[1].innerHTML+="<button>1</button>";//一般地圖
}

childNodes的起始值是1,
這點比較特別,
一般都是0。

"*":地雷
0:空地
1~8:掃雷器(數字)

//判斷地圖狀態
function caseMap(wd,row,col){
	switch(boommap[row][col]){
		case "*":
			map[0].childNodes[wd+1].classList.add("boom");
			break;
		case 0:
			map[0].childNodes[wd+1].classList.add("empty");
			break;
		default:
			map[0].childNodes[wd+1].classList.add("number");
			break;
	}	
}

【心得】

地圖總算是完成,不過程式不太漂亮,
明天有時間要來優化。

感謝撥冗閱讀,
有錯誤地方請多指教。


上一篇
[專案02]自製踩地雷(五)隨機地雷放置完成
下一篇
[專案02]自製踩地雷(日)玩家有不死之身
系列文
一週程式專案挑戰26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

哇! 是經典遊戲踩地雷耶~ 這個主題不錯哦,小馬喜歡,
之後有空也來跟著你實作看看,
目前小馬也忙於參賽努力生稿中,
一起加油完賽吧。

謝謝小馬的鼓勵
生稿真的不容易,
好想要只貼程式碼。
加油!加油!

不明 檢舉
【**此則訊息已被站方移除**】

我要留言

立即登入留言